package com.example.demo.jucConcurrent.ConcurrenHashMap案例;

/**
 * 并发问题分析:
 *
 * 现在我们已经说过了put过程,我们可以看到get过程中没有加锁的,那么我们就需要取考虑并发问题
 * 添加节点的操作put和删除节点的操作remove,都是要加segment上的独占锁,所以他们之间自然不会有问题,我们要考虑过
 * 的问题是get的时候会在同一个segment中发生了put或remove操作
 *
 * put操作的线程安全向
 * 01:初始化槽,这个我们之前已经说过了,使用cas来初始化Segmen中的数组
 * 02:添加的节点到链表的操作时插入到表头的,所以,如果在这个时候get操作在链表遍历的过程已经到了中间,是不会影响的,当然,另外一个
 * 并发问题就是get操作在put之后,需要保证刚刚插入的节点被读取,这个依赖于setEntryAt方法中使用的UNsAfe.putOrderObject
 * 扩容.扩容是新创建的数组,然后迁移数据,最后将new TbaLe设置给属性table,所以如果,get操作此时也在进行,那么也没关系,如果get
 * 进行,那么就是在旧的table上做操作查询,而put先行,那么put操作的可见性,就保证了table使用volatile关键字
 *
 * remove操作的线程安全性
 * 01:remove操作我们
 *
 * ConcurrentHashMap
 * 在jdk1.7之前ConcurrentHashMap是通过分段锁机制来实现的,所以其最大并发度受Segment的个数限制,在jdk1.8中,ConcurrentHashMap的实现原理摒弃了这种设计,而
 * 是选择了与HashMap类型的数组+链表+红黑树的方式来实现,而加锁则采用CAS和Synchronized实现
 *
 */
public class test02 {
}

















































